package chpt04;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;

public class InstantTest {

	public static void main(String[] args) {
		// 使用从离GMT时间1970-01-01T00:00:00多少时间间隔来创建Instant实例
		Instant beforeEpoch = Instant.ofEpochSecond(-10);
		Instant epochInstant= Instant.ofEpochSecond(0);
		Instant afterEpoch = epochInstant.plusSeconds(60);
		System.out.println(beforeEpoch); // 1969-12-31T23:59:50Z
		System.out.println(epochInstant);// 1970-01-01T00:00:00Z
		System.out.println(afterEpoch);  // 1970-01-01T00:01:00Z
		// 获取从epoch开始直到afterEpoch为止经过了多少秒
		long duration = epochInstant.until(afterEpoch, ChronoUnit.SECONDS);
		System.out.println("afterEpoch - epochInstant: " + duration+"秒");
		System.out.println("=============讲Instant转化为LocalDateTime==================");
		// Instant只代表时间戳，可以结合时区将Instant转化成人类熟悉的时间
		ZoneId zoneId = ZoneId.systemDefault(); // 获得系统默认时区（东八区）
		// ZoneId zoneId = ZoneId.of("Asia/Shanghai"); // 也可这样指定时区
		System.out.println("系统默认时区: "+zoneId);
		LocalDateTime afterDate = LocalDateTime.ofInstant(afterEpoch, zoneId);
		System.out.println("afterDate="+afterDate); // 东八区的本地时间1970-01-01T08:01
		// 将after结合时区转化为纪元秒
		Instant instant8 = afterDate.toInstant(ZoneOffset.of("+08:00"));
		Instant instant7 = afterDate.toInstant(ZoneOffset.of("+07:00"));
		// 1970-01-01T08:01在东八区得到的Instant是60秒，在东七区得到的是3660秒
		long epoch8 = instant8.getEpochSecond(); // 60
		long epoch7 = instant7.getEpochSecond(); // 3660
		System.out.println("+07:00 instant: "+epoch7); // 3660
		System.out.println("+08:00 instant: "+epoch8); // 60
		// 讲1970-01-01T08:01转换为带时区的日期时间类
		ZonedDateTime ofInstant = ZonedDateTime.ofInstant(instant8, zoneId);
		System.out.println("EpochInstant= "+ofInstant);
		System.out.println("=============通过ZoneId.of获取时区==================");
		// 使用Instat时间戳根据时区生成当地日期
		Instant now = Instant.now(); // 获得当前系统所在时区的时间戳
		ZoneId id1 = ZoneId.of("UTC+08:00");     // +8时区
		ZoneId id2 = ZoneId.of("Europe/London"); // 0时区
		LocalDateTime now1 = LocalDateTime.ofInstant(now, id1); 
		LocalDateTime now2 = LocalDateTime.ofInstant(now, id2);
		System.out.println(id1 + " datetime: " + now1);
		System.out.println(id2 + " datetime: " + now2);
		// 同一个Instant放在不同时区会生成不同的时间
		
		/*LocalDate now = LocalDate.now();
		LocalDate minusWeeks = now.minusWeeks(3);
		Period until = minusWeeks.until(now);
		System.out.println(until.getDays());*/
	}

}
